package com.hwd.gmall.product.service;

import com.hwd.gmall.model.product.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 内部调用的接口类的业务层接口
 *
 * @author 黄伟东/Victor
 * @date 2022/4/22 10:16
 */
public interface ItemService {

    /**
     * 根据skuId获取skuInfo信息
     *
     * @param skuId skuInfo表的id
     * @return com.hwd.gmall.model.product.SkuInfo
     */
    SkuInfo getSkuInfo(Long skuId);

    /**
     * 根据skuId获取skuInfo信息
     *
     * @param skuId skuInfo表的id
     * @return com.hwd.gmall.model.product.SkuInfo
     */
    SkuInfo getSkuInfoFromRedisOrDb(Long skuId);

    /**
     * 根据第三级分类id查询所有分类的信息（包括一级、二级分类信息）
     *
     * @param category3Id 三级分类id
     * @return com.hwd.gmall.model.product.BaseCategoryView
     */
    BaseCategoryView getCategory(Long category3Id);

    /**
     * 根据skuIf查询sku的图片列表
     *
     * @param skuId skuInfo表的id
     * @return java.util.List<com.hwd.gmall.model.product.SkuImage>
     */
    List<SkuImage> listSkuImages(Long skuId);

    /**
     * 根据spuId和skuId查询商品的销售属性
     *
     * @param spuId spuId
     * @param skuId skuId
     * @return java.util.List<com.hwd.gmall.model.product.SpuSaleAttr>
     */
    List<SpuSaleAttr> listSpuSaleAttrBySpuIdAndSkuId(Long spuId, Long skuId);


    /**
     * 根据skuId查询sku的价格
     *
     * @param skuId sku的id
     * @return java.math.BigDecimal
     */
    BigDecimal getSkuPrice(Long skuId);


    /**
     * 查询指定spu的所有销售属性值与sku对应关系
     *
     * @param spuId spuId
     * @return java.util.List<java.util.Map < java.Long.String, java.lang.String>>
     */
    Map<String, String> getSkuIdsValueIdsMap(Long spuId);

    /**
     * 根据品牌id查询品牌信息
     *
     * @param id 品牌表id
     * @return com.hwd.gmall.model.product.BaseTrademark
     */
    BaseTrademark getBaseTrademark(Long id);

    /**
     * 根据skuId查询商品的平台属性名称和值信息
     *
     * @param skuId shuInfo表的id
     * @return java.util.List<com.hwd.gmall.model.product.BaseAttrInfo>
     */
    List<BaseAttrInfo> getBaseAttrInfo(Long skuId);

    /**
     * 扣减库存
     *
     * @param stockDeductMap 扣减的商品id和数量的map对象
     * @return java.lang.Boolean
     */
    Boolean deductStock(Map<String, Object> stockDeductMap);

    /**
     * 库存回滚
     *
     * @param stockRollbackMap 回滚的商品id和数量的map对象
     * @return java.lang.Boolean
     */
    Boolean rollbackStock(Map<String, Object> stockRollbackMap);
}
